﻿using Npgsql;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace VoteInformationSystem.Models
{
    public class NpgsqlWahlkreisRepository : IWahlkreisRepository
    {
		public Wahlkreis Get(int Id)
        {
            Wahlkreis wahlkreis = null;

            using (NpgsqlConnection pgConnection = NpgsqlConnectionProvider.GetConnection())
            using (NpgsqlCommand command = new NpgsqlCommand(
               "select * from \"WahlkreisInformationen\"(:id)",
               pgConnection))
            {
                command.Parameters.Add(new NpgsqlParameter("id", NpgsqlTypes.NpgsqlDbType.Integer));
                command.Prepare();
                command.Parameters.First<NpgsqlParameter>().Value = Id;
                using (NpgsqlDataReader dataReader = command.ExecuteReader())
                {
                    if (dataReader.Read())
                    {
                        wahlkreis = new Wahlkreis()
                        {
                            Id = dataReader.GetInt32(0),
                            IdBundesland = dataReader.GetInt32(1),
                            Name = dataReader.GetString(2),
                            AnzahlWahlberechtigte = dataReader.GetInt32(3),
                            AnzahlAbgegebeneStimmen = dataReader.GetInt32(4),
                            Nummer = dataReader.GetInt32(5),
                            DirektkandidatVorname = dataReader.GetString(6),
                            DirektkandidatNachname = dataReader.GetString(7),
                            DirektkandidatJahrgang = dataReader.GetInt32(8),
                            DirektkandidatParteiname = dataReader.GetString(9),
                            ZweitstimmenParteiname = dataReader.GetString(10)
                        };
                    }
                }
            }

            return wahlkreis;
        }

        public IEnumerable<Wahlkreis> GetQ7()
        {
            IList<Wahlkreis> wahlkreise = new List<Wahlkreis>();

            using (NpgsqlConnection pgConnection = NpgsqlConnectionProvider.GetConnection())
            using (NpgsqlCommand command = new NpgsqlCommand(
               "select * from \"WahlkreisInformationenQ7\"()",
               pgConnection))
            {
                command.Prepare();
                using (NpgsqlDataReader dataReader = command.ExecuteReader())
                {
                    while (dataReader.Read())
                    {
                        wahlkreise.Add(new Wahlkreis()
                        {
                            Id = dataReader.GetInt32(0),
                            IdBundesland = dataReader.GetInt32(1),
                            Name = dataReader.GetString(2),
                            AnzahlWahlberechtigte = dataReader.GetInt32(3),
                            AnzahlAbgegebeneStimmen = dataReader.GetInt32(4),
                            Nummer = dataReader.GetInt32(5),
                            DirektkandidatVorname = dataReader.GetString(6),
                            DirektkandidatNachname = dataReader.GetString(7),
                            DirektkandidatJahrgang = dataReader.GetInt32(8),
                            DirektkandidatParteiname = dataReader.GetString(9),
                            ZweitstimmenParteiname = dataReader.GetString(10)
                        });
                    }
                }
            }

            return wahlkreise;
        }
    
        public IEnumerable<Wahlkreis> GetByBundesland(int LandId)
        {
            IList<Wahlkreis> wahlkreise = new List<Wahlkreis>();

            using (NpgsqlConnection pgConnection = NpgsqlConnectionProvider.GetConnection())
            using (NpgsqlCommand command = new NpgsqlCommand(
                "select * from \"WahlkreisInformationenAll\"(:landid)", 
            	pgConnection))
            {
                command.Parameters.Add(new NpgsqlParameter("landid", NpgsqlTypes.NpgsqlDbType.Integer));
                command.Prepare();
                command.Parameters.First<NpgsqlParameter>().Value = LandId;
                using (NpgsqlDataReader dataReader = command.ExecuteReader())
                {
                    while (dataReader.Read())
                    {
                        wahlkreise.Add(new Wahlkreis()
                        {
                            Id = dataReader.GetInt32(0),
                            IdBundesland = dataReader.GetInt32(1),
                            Name = dataReader.GetString(2),
                            AnzahlWahlberechtigte = dataReader.GetInt32(3),
                            AnzahlAbgegebeneStimmen = dataReader.GetInt32(4),
                            Nummer = dataReader.GetInt32(5),
                            DirektkandidatVorname = dataReader.GetString(6),
                            DirektkandidatNachname = dataReader.GetString(7),
                            DirektkandidatJahrgang = dataReader.GetInt32(8),
                            DirektkandidatParteiname = (dataReader.GetValue(9).Equals(DBNull.Value)) ? "parteilos" : dataReader.GetString(9),
                            ZweitstimmenParteiname = dataReader.GetString(10)
                        });
                    }
                }
            }

            return wahlkreise;
        }

        public Wahlkreis GetPrevious(int Id, int IdVorherigeBundestagswahl)
        {
            using (NpgsqlConnection pgConnection = NpgsqlConnectionProvider.GetConnection())
            {
                using (NpgsqlCommand command = new NpgsqlCommand("with Wahlkreisname as " +
                                                                 "(select wName " +
                                                                 "from \"Wahlkreise\" " +
                                                                 "where idwahlkreis = :id) " +
                                                                 "select idwahlkreis  " +
                                                                 "from  \"Wahlkreise\" " +
                                                                 "join \"Bundeslaender\" using (idbundesland) " +
                                                                 "where wName = (select wName from Wahlkreisname) " +
                                                                 "and idbundestagswahl = :idvorherigebundestagswahl",
                                                                 pgConnection))
                {
                    command.Parameters.Add(new NpgsqlParameter("id", NpgsqlTypes.NpgsqlDbType.Integer));
                    command.Parameters.Add(new NpgsqlParameter("idvorherigebundestagswahl", NpgsqlTypes.NpgsqlDbType.Integer));
                    command.Prepare();
                    command.Parameters.First<NpgsqlParameter>().Value = Id;
                    command.Parameters.Last<NpgsqlParameter>().Value = IdVorherigeBundestagswahl;
                    using (NpgsqlDataReader dataReader = command.ExecuteReader())
                    {
                        if (dataReader.Read())
                        {
                            return Get(dataReader.GetInt32(0));
                        }
                    }
                }
            }
            return null;
        }

        public IEnumerable<Direktkandidat> GetDirektkandidaten(int WahlkreisId)
        {
            IList<Direktkandidat> direktkandidaten = new List<Direktkandidat>();

            using (NpgsqlConnection pgConnection = NpgsqlConnectionProvider.GetConnection())
            using (NpgsqlCommand command = new NpgsqlCommand(
                "select iddirektkandidat, Vorname, Nachname, Jahrgang, pname from \"Wahlkreise\" join \"Direktkandidaten\" using (idwahlkreis) join \"Personen\" using (idperson) left join \"Parteien\" using (idpartei) where idwahlkreis = (:id)",
                pgConnection))
            {
                command.Parameters.Add(new NpgsqlParameter("id", NpgsqlTypes.NpgsqlDbType.Integer));
                command.Prepare();
                command.Parameters.First<NpgsqlParameter>().Value = WahlkreisId;
                using (NpgsqlDataReader dataReader = command.ExecuteReader())
                {
                    while (dataReader.Read())
                    {
                        direktkandidaten.Add(new Direktkandidat()
                        {
                            Id = dataReader.GetInt32(0),
                            Vorname = dataReader.GetString(1),
                            Nachname = dataReader.GetString(2),
                            Jahrgang = dataReader.GetInt32(3),
                            Parteiname = (dataReader.GetValue(4).Equals(DBNull.Value)) ? "parteilos" : dataReader.GetString(4)
                        });
                    }
                }
            }

            return direktkandidaten;
        }
    }
}
